#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <iterator>

using std::cout;
using std::endl;
using std::vector;
using std::for_each;
using std::bind1st;
using std::remove_if;
using std::ostream_iterator;

//目前display是有两个参数的，但for_each的参数中
//需要指定一个一元函数, 产生了矛盾, 编译不通过
//
//还是希望能调用display，则必须改变display参数的个数
//让其提前绑定一个参数, 则需要使用函数绑定器
void display(int x, int y)
{
    cout << x << ", " << y << endl;
}

int test0()
{
    vector<int> numbers{1, 2, 3, 4, 5};
    //普通函数
    //for_each(numbers.begin(), numbers.end(), bind1st(display, 1));
    cout << endl;

    return 0;
}

bool comparator(int x, int y)
{
    return x > y;
}

void test1()
{
    vector<int> numbers{5, 1, 3, 2, 4, 66, 7, 4, 66, 66, 6, 9, 8};
    std::copy(numbers.begin(), numbers.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    //bind1st和bind2nd不能作用于普通函数, 这是一个缺陷
    //需要更好的函数绑定器std::bind
    std::greater<int> gt;
    gt(1, 2);
    numbers.erase(remove_if(numbers.begin(), numbers.end(), std::bind2nd(gt, 65)), 
                  numbers.end());
    std::copy(numbers.begin(), numbers.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
}

int main()
{
    test1();
    return 0;
}
